package br.com.toscano.gobra.view;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.inject.Inject;

import br.com.toscano.gobra.business.PerfilBC;
import br.com.toscano.gobra.business.UsuarioBC;
import br.com.toscano.gobra.domain.Perfil;
import br.com.toscano.gobra.domain.Usuario;
import br.gov.frameworkdemoiselle.annotation.PreviousView;
import br.gov.frameworkdemoiselle.stereotype.ViewController;
import br.gov.frameworkdemoiselle.template.AbstractEditPageBean;
import br.gov.frameworkdemoiselle.transaction.Transactional;

@ViewController
@PreviousView("./usuario_list.jsf")
public class UsuarioEditMB extends AbstractEditPageBean<Usuario, Long> {

	private static final long serialVersionUID = 1L;

	@Inject
	private UsuarioBC usuarioBC;

	@Inject
	private PerfilBC perfilBC;
	
	@Override
	@Transactional
	public String delete() {
		this.usuarioBC.delete(getId());
		return getPreviousView();
	}
	
	public void montarObjeto() {
		List<Perfil> perfils = getSelected();
		
		this.getBean().setListaPerfil(perfils);
	}
	
	@Override
	@Transactional
	public String insert() {
		montarObjeto();
		this.usuarioBC.insert(getBean());
		return getPreviousView();
	}
	
	@Override
	@Transactional
	public String update() {
		montarObjeto();
		this.usuarioBC.update(getBean());
		return getPreviousView();
	}
	
	@Override
	protected Usuario handleLoad(Long id) {
		setBean(this.usuarioBC.load(id));

		
		getItems();
		
		if(this.getBean() != null && this.getBean().getListaPerfil() != null) {
			for (Perfil pa : items) {
				for (Perfil paCadastrado : this.getBean().getListaPerfil()) {
					if (pa.equals(paCadastrado)) {
						checkMap.put(pa, new Boolean(true));
					}
				}
				if (checkMap.get(pa) == null ) {
					checkMap.put(pa, new Boolean(false));
				}
			}
		}

		
		return this.getBean();
	}

	private Map<Perfil,Boolean> checkMap = new HashMap<Perfil,Boolean>();

	private List<Perfil> items;
	
	
	public List<Perfil> getItems() {
		if (items == null) {
			items = this.perfilBC.findAll();
		}
		return items;
	}

	public Map<Perfil, Boolean> getCheckMap() {
		return checkMap;
	}
	
	public List<Perfil> getSelected() {
		List<Perfil> result = new ArrayList<Perfil>();
		
	    for (Entry<Perfil,Boolean> entry : checkMap.entrySet()) {
	        if (entry.getValue()) {
	            result.add(entry.getKey());
	        }
	    }
	    return result;
	}
}